package com.offcn.user.service.impl;

import com.offcn.user.enums.UserExceptionEnum;
import com.offcn.user.exception.UserException;
import com.offcn.user.mapper.TMemberAddressMapper;
import com.offcn.user.mapper.TMemberMapper;
import com.offcn.user.po.TMember;
import com.offcn.user.po.TMemberAddress;
import com.offcn.user.po.TMemberAddressExample;
import com.offcn.user.po.TMemberExample;
import com.offcn.user.service.UserService;
import com.offcn.user.vo.resp.UserRespVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private TMemberMapper memberMapper;

    @Autowired
    private TMemberAddressMapper memberAddressMapper;

    @Override
    public void registerUser(TMember member) {

        //1、判断注册账号（手机号码）是否已经存在？

        //创建查询条件，查询指定手机号是否存在
        TMemberExample example = new TMemberExample();
        example.createCriteria().andLoginacctEqualTo(member.getLoginacct());
        List<TMember> memberList = memberMapper.selectByExample(example);

        //判断查询结果，看集合是否大于0，表示该号码已经被注册
        if(memberList.size()>0){
            //账号已经存在，禁止注册
            throw new UserException(UserExceptionEnum.LOGINACCT_EXIST);
        }

        //账号不存在继续注册

        //设置密码，密码加密
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

        //加密密码
        String encodePassword = encoder.encode(member.getUserpswd());
        //设置加密后密码到用户对象
        member.setUserpswd(encodePassword);

        member.setEmail(member.getEmail());
        member.setUsername(member.getUsername());

        //设置实名认证状态
        //实名认证状态 0 - 未实名认证， 1 - 实名认证申请中， 2 - 已实名认证

        member.setAuthstatus("0");
        //设置用户类型 用户类型: 0 - 个人， 1 - 企业
        member.setUsertype("0");

        //账户类型: 0 - 企业， 1 - 个体， 2 - 个人， 3 - 政府
        member.setAccttype("2");

        //保存注册用户数据到数据库
        memberMapper.insert(member);


    }

    @Override
    public TMember login(String username, String password) {

        //1、根据用户注册用户名从数据库查询用户信息
        TMemberExample example = new TMemberExample();
        example.createCriteria().andUsernameEqualTo(username);
        List<TMember> memberList = memberMapper.selectByExample(example);

        //判断集合不为空，集合大小大于0
        if(memberList!=null&&memberList.size()>0){
            //提取第一个集合数据
            TMember member = memberList.get(0);

            //密码是加密的，所以进行比对
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
            //第一个参数，原始密码（名文密码） 第二个参数：加密后密码
            boolean b = passwordEncoder.matches(password, member.getUserpswd());
            return b?member:null;

        }
        return null;
    }

    @Override
    public List<TMemberAddress> addressList(Integer memberId) {
        TMemberAddressExample example = new TMemberAddressExample();
        TMemberAddressExample.Criteria criteria = example.createCriteria();
        criteria.andMemberidEqualTo(memberId);
        return memberAddressMapper.selectByExample(example);
    }

    @Override
    public UserRespVo findUserById(Integer memberId) {

        TMember tMember = memberMapper.selectByPrimaryKey(memberId);
        //创建UserrespVo
        UserRespVo respVo = new UserRespVo();

        //复制member属性值到respVo
        BeanUtils.copyProperties(tMember,respVo);


        return respVo;
    }
}
